package com.example.user.adapter.in.web.dto;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

/**
 * 通用响应结果类
 * 用于封装所有API接口的响应数据，统一返回格式
 * 
 * 这样做有以下好处：
 * 1. 前端可以统一处理响应格式
 * 2. 便于统一错误处理
 * 3. 提高代码的可维护性
 * 
 * 使用泛型<T>可以让这个类适用于任何类型的数据
 * 
 * @Data Lombok注解，自动生成getter、setter、toString等方法
 * @NoArgsConstructor Lombok注解，生成无参构造函数
 * @AllArgsConstructor Lombok注解，生成全参构造函数
 */
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Result<T> {

    /**
     * 响应码
     * 
     * 用于表示请求处理的结果状态
     * 常见的响应码：
     * 200 - 成功
     * 400 - 请求参数错误
     * 401 - 未授权
     * 403 - 禁止访问
     * 500 - 服务器内部错误
     */
    private Integer code;

    /**
     * 响应消息
     * 
     * 用于描述请求处理的结果信息
     * 成功时可以是"操作成功"
     * 失败时可以是具体的错误信息，如"用户名或密码错误"
     */
    private String message;

    /**
     * 响应数据
     * 
     * 用于携带具体的业务数据
     * 可以是任何类型，如用户信息、列表数据等
     * 使用泛型T使得这个字段可以适应不同类型的数据
     */
    private T data;

    /**
     * 成功响应静态方法
     * 
     * 用于创建成功的响应结果
     * 
     * @param data 响应数据
     * @return Result<T> 成功的响应结果
     * @param <T> 泛型参数，表示数据的类型
     */
    public static <T> Result<T> success(T data) {
        return new Result<>(200, "操作成功", data);
    }

    /**
     * 成功响应静态方法（无数据）
     * 
     * 用于创建不携带数据的成功响应结果
     * 
     * @return Result<T> 成功的响应结果
     * @param <T> 泛型参数，表示数据的类型
     */
    public static <T> Result<T> success() {
        return new Result<>(200, "操作成功", null);
    }

    /**
     * 成功响应静态方法（自定义消息）
     * 
     * 用于创建携带自定义成功消息的响应结果
     * 
     * @param message 自定义的成功消息
     * @param data 响应数据
     * @return Result<T> 成功的响应结果
     * @param <T> 泛型参数，表示数据的类型
     */
    public static <T> Result<T> success(String message, T data) {
        return new Result<>(200, message, data);
    }

    /**
     * 失败响应静态方法
     * 
     * 用于创建失败的响应结果，默认使用500状态码
     * 
     * @param message 错误消息
     * @return Result<T> 失败的响应结果
     * @param <T> 泛型参数，表示数据的类型
     */
    public static <T> Result<T> error(String message) {
        return new Result<>(500, message, null);
    }

    /**
     * 失败响应静态方法（自定义状态码）
     * 
     * 用于创建携带自定义状态码的失败响应结果
     * 
     * @param code 自定义状态码
     * @param message 错误消息
     * @return Result<T> 失败的响应结果
     * @param <T> 泛型参数，表示数据的类型
     */
    public static <T> Result<T> error(Integer code, String message) {
        return new Result<>(code, message, null);
    }

    /**
     * 未授权响应静态方法
     * 
     * 用于创建401未授权的响应结果
     * 
     * @param message 错误消息
     * @return Result<T> 未授权的响应结果
     * @param <T> 泛型参数，表示数据的类型
     */
    public static <T> Result<T> unauthorized(String message) {
        return new Result<>(401, message, null);
    }

    /**
     * 禁止访问响应静态方法
     * 
     * 用于创建403禁止访问的响应结果
     * 
     * @param message 错误消息
     * @return Result<T> 禁止访问的响应结果
     * @param <T> 泛型参数，表示数据的类型
     */
    public static <T> Result<T> forbidden(String message) {
        return new Result<>(403, message, null);
    }
}